import os
#render_template渲染模板
from flask import Flask,render_template,request
#数据库
import sqlite3
#分页插件
from flask_pagination import Pagination
#绘图词云
from matplotlib import pyplot as plt    #绘图
from wordcloud import WordCloud         #词云
from collections import Counter  #两个字典取并集，重点在于对相同key的value相加。获得词频字典

#SQLAlchemy ，Python工具包是一个强大的ORM Mapper
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__) #models中含有，只能使用一个

##############分页###############################
base_dir = os.path.abspath(os.path.dirname(__file__))   # 获取文件的绝对路径
#用于连接的数据库 URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(base_dir, 'news.db')   # 配置数据库的绝对路径
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True     # 配置相关设置
db = SQLAlchemy(app)   # SQLAlchemy()为了下面的类继承db.Model

class News(db.Model):
    __tablename__ = "newsInfo"  # 注意表单的名称
    id = db.Column(db.Integer, primary_key=True, nullable=False)  # 编号
    type = db.Column(db.String(100)) #unique如果设为 True，这列不允许出现重复的值
    url = db.Column(db.String(100))
    title = db.Column(db.String(100))
    day = db.Column(db.String(100))
    views = db.Column(db.Integer)
    keywords = db.Column(db.String(100))
#############################################

@app.route('/')
def index():
    data = []  # 存放总新闻数和总浏览量
    conn = sqlite3.connect("news.db")
    cur = conn.cursor()
    sql = "select count(id),sum(views) from newsInfo"
    item = cur.execute(sql)
    for i in item:
        data.append(i[0])
        data.append(i[1])
    #print(data)
    return render_template("index.html", data=data)

'''
Paginator分页，可接受的分页对象必须是orm的查询集或者list、tuple。
当需要使用原生sql查询数据，分页就无法使用Paginator。
'''
@app.route('/new')
def new():
    datalist = []  # 存放数据
    conn = sqlite3.connect("news.db")
    cur = conn.cursor()
    sql = "select id,type,url,title,day,views from newsInfo"
    data = cur.execute(sql)
    for item in data:
        datalist.append(item)
    cur.close()
    conn.close()

    page = int(request.args.get('page', 1)) #默认值为1
    # page = 1
    #paginate = News.query.paginate(page=int(page), per_page=10) #每页10条
    paginate = News.query.order_by(News.id.desc()).paginate(page=int(page), per_page=10)  # 每页10条
    news = paginate.items
    return render_template("new.html", news=news, pagination=paginate)

@app.route('/type')
def type():
    type = [] #六个类型
    num = [] #每个类型的总数量
    conn = sqlite3.connect("news.db")
    cur = conn.cursor()
    sql = "select type,count(type) from newsInfo group by type"
    data = cur.execute(sql)
    #['llxx', 'mtjj', 'wmcj', 'xxyw', 'zhxw', 'ztwz']
    for item in data:
        if item[0] == 'xxyw':
            type.append('学校要闻')
        elif item[0] == 'zhxw':
            type.append('综合新闻')
        elif item[0] == 'llxx':
            type.append('理论学习')
        elif item[0] == 'mtjj':
            type.append('媒体聚焦')
        elif item[0] == 'wmcj':
            type.append('文明创建')
        else:
            type.append('专题网站')
        #添加数量
        num.append(item[1])

    cur.close()
    conn.close()

    #print(type)
    return render_template("type.html", type=type, num=num)

#词云
# 根据词频生成词云
def create_word_cloud(): #取并集有点慢慢慢

    # 1 获取词语
    datas = ""
    conn = sqlite3.connect("news.db")  # 表示上一级目录下面的文件
    cur = conn.cursor()
    sql = "select keywords from newsInfo"
    dat = cur.execute(sql)
    for item in dat:
        if (item[0] != ""): #关键词可能为空
            datas = ''.join([datas, item[0]]) #不断的在字符串后面追加
    #2 得到词频数组
    #首先以空格分隔成为字符串数组，
    #然后由于最后一个为空['学校:9', '']，故用split去掉最后一个字符串
    datas = datas.strip(" ").split(" ")
    cur.close()
    conn.close()

    #3 生成词频字典
    frequencies = {}
    for data in datas:
        arr = data.split(":")  # bug:最后一个为空
        frequency = {}  # 只存放一个，每次归零
        frequency[arr[0]] = int(arr[1])
        #取并集（相同关键字，可能出现多次）
        X, Y = Counter(frequency), Counter(frequencies)
        frequencies = dict(X + Y)
    #print(frequencies)

    wc = WordCloud(
        background_color="white",
        font_path=r"../static/font/msyh.ttc",
        max_words=100, #指定词云显示的最大单词数量
        width=2000,
        height=1200,
    )
    # 根据词出现的频率生成词云
    word_cloud = wc.generate_from_frequencies(frequencies)
    # 显示词云文件
    plt.imshow(word_cloud)
    plt.axis("off")
    #plt.show() #不能与savefig()同时执行
    # 写词云图片,保存成图片
    #plt.savefig(r'.\static\assets\img\wordcloud.jpg', dpi=500)
    word_cloud.to_file(r'.\static\assets\img\wordcloud.jpg')
    print("词云图保存成功！")
# 根据词频生成词云#############################################
#create_word_cloud()

@app.route('/word')
def word():
    return render_template("word.html")


#获取十条热搜新闻，返回列表
def getHot():
    newlist = []

    conn = sqlite3.connect("news.db")  # 表示上一级目录下面的文件
    cur = conn.cursor()
    #浏览量最高的十条新闻
    sql = "select url,title,views from newsInfo order by views desc limit 10"
    new = cur.execute(sql)
    flag = 1
    for item in new:
        data = []
        data.append(flag)
        flag+=1
        data.append(item[0])
        data.append(item[1])
        data.append(item[2])
        #\u200b是不可见字符，trim()无法去掉，要用replace
        newlist.append(data)

    #print(newlist)
    return newlist
#热搜
@app.route('/hot')
def hot():
    newlist = getHot()
    return render_template("hot.html", newlist=newlist)


if __name__ == '__main__':
    app.run()
